﻿/********************************************************
 * Project Name   : VAdvantage
 * Class Name     : AcctSchemaDefaultCopy.
 * Purpose        : Add or Copy Acct Schema Default Accounts
 * Class Used     : ProcessEngine.SvrProcess
 * Chronological    Development
 * Deepak           23-Nov-2009
  ******************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using VAdvantage.Process;
using VAdvantage.Classes;
using VAdvantage.Model;
using VAdvantage.DataBase;
using VAdvantage.SqlExec;
using System.Data;
using System.Data.SqlClient;
using VAdvantage.Logging;
using VAdvantage.Utility;
using VAdvantage.ProcessEngine;namespace VAdvantage.Process
{
    public class AcctSchemaDefaultCopy : ProcessEngine.SvrProcess
    {
    /**	Acct Schema					*/
	private int			_C_AcctSchema_ID = 0;
	/** Copy & Overwrite			*/
	private Boolean 	_CopyOverwriteAcct = false;
	
	
	/// <summary>
	/// Prepare - e.g., get Parameters.
	/// </summary>
	protected override void Prepare()
	{
		ProcessInfoParameter[] para = GetParameter();
		for (int i = 0; i < para.Length; i++)
		{
			String name = para[i].GetParameterName();
			if (para[i].GetParameter() == null)
            {
				;
            }
			else if (name.Equals("C_AcctSchema_ID"))
            {
				_C_AcctSchema_ID = para[i].GetParameterAsInt();
            }
			else if (name.Equals("CopyOverwriteAcct"))
            {
				_CopyOverwriteAcct = "Y".Equals(para[i].GetParameter());
            }
			else
            {
				log.Log(Level.SEVERE, "Unknown Parameter: " + name);
            }
		}
	}	//	prepare
		
	/// <summary>
	/// Process
	/// </summary>
	/// <returns></returns>
	protected override String DoIt()
	{
		log.Info("C_AcctSchema_ID=" + _C_AcctSchema_ID
			+ ", CopyOverwriteAcct=" + _CopyOverwriteAcct);
		if (_C_AcctSchema_ID == 0)
        {
			throw new Exception("C_AcctSchema_ID=0");
        }
		MAcctSchema a = MAcctSchema.Get(GetCtx(), _C_AcctSchema_ID);
        if (a.Get_ID() == 0)
        {
            throw new Exception("Not Found - C_AcctSchema_ID=" + _C_AcctSchema_ID);
        }
		MAcctSchemaDefault acct = MAcctSchemaDefault.Get (GetCtx(), _C_AcctSchema_ID);
        if (acct == null || acct.Get_ID() == 0)
        {
            throw new Exception("Default Not Found - C_AcctSchema_ID=" + _C_AcctSchema_ID);
        }
		String sql = null;
		int updated = 0;
		int created = 0;
		int updatedTotal = 0;
		int createdTotal = 0;
		
		//	Update existing Product Category
		if (_CopyOverwriteAcct)
		{
			sql = "UPDATE M_Product_Category_Acct pa "
				+ "SET P_Revenue_Acct=" + acct.GetP_Revenue_Acct()
				+ ", P_Expense_Acct=" + acct.GetP_Expense_Acct()
				+ ", P_CostAdjustment_Acct=" + acct.GetP_CostAdjustment_Acct()
				+ ", P_InventoryClearing_Acct=" + acct.GetP_InventoryClearing_Acct()
				+ ", P_Asset_Acct=" + acct.GetP_Asset_Acct()
				+ ", P_COGS_Acct=" + acct.GetP_COGS_Acct()
				+ ", P_PurchasePriceVariance_Acct=" + acct.GetP_PurchasePriceVariance_Acct()
				+ ", P_InvoicePriceVariance_Acct=" + acct.GetP_InvoicePriceVariance_Acct()
				+ ", P_TradeDiscountRec_Acct=" + acct.GetP_TradeDiscountRec_Acct()
				+ ", P_TradeDiscountGrant_Acct=" + acct.GetP_TradeDiscountGrant_Acct()
				+ ", Updated=SysDate, UpdatedBy=0 "
				+ "WHERE pa.C_AcctSchema_ID=" + _C_AcctSchema_ID
				+ " AND EXISTS (SELECT * FROM M_Product_Category p "
					+ "WHERE p.M_Product_Category_ID=pa.M_Product_Category_ID)";
			//updated = DataBase.executeUpdate(sql, Get_TrxName());
            updated = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
			AddLog(0, null, Utility.Util.GetValueOfDecimal(updated), "@Updated@ @M_Product_Category_ID@");
			updatedTotal += updated;
		}
		//	Insert new Product Category
		sql = "INSERT INTO M_Product_Category_Acct "
			+ "(M_Product_Category_ID, C_AcctSchema_ID,"
			+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,"
			+ " P_Revenue_Acct, P_Expense_Acct, P_CostAdjustment_Acct, P_InventoryClearing_Acct, P_Asset_Acct, P_CoGs_Acct,"
			+ " P_PurchasePriceVariance_Acct, P_InvoicePriceVariance_Acct,"
			+ " P_TradeDiscountRec_Acct, P_TradeDiscountGrant_Acct) "
			+ "SELECT p.M_Product_Category_ID, acct.C_AcctSchema_ID,"
			+ " p.AD_Client_ID, p.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,"
			+ " acct.P_Revenue_Acct, acct.P_Expense_Acct, acct.P_CostAdjustment_Acct, acct.P_InventoryClearing_Acct, acct.P_Asset_Acct, acct.P_CoGs_Acct,"
			+ " acct.P_PurchasePriceVariance_Acct, acct.P_InvoicePriceVariance_Acct,"
			+ " acct.P_TradeDiscountRec_Acct, acct.P_TradeDiscountGrant_Acct "
			+ "FROM M_Product_Category p"
			+ " INNER JOIN C_AcctSchema_Default acct ON (p.AD_Client_ID=acct.AD_Client_ID) "
			+ "WHERE acct.C_AcctSchema_ID=" + _C_AcctSchema_ID
			+ " AND NOT EXISTS (SELECT * FROM M_Product_Category_Acct pa "
				+ "WHERE pa.M_Product_Category_ID=p.M_Product_Category_ID"
				+ " AND pa.C_AcctSchema_ID=acct.C_AcctSchema_ID)";
		created = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
		AddLog(0, null,Utility.Util.GetValueOfDecimal(created), "@Created@ @M_Product_Category_ID@");
		createdTotal += created;
		if (!_CopyOverwriteAcct)	//	Insert new Products
		{
			sql = "INSERT INTO M_Product_Acct "
				+ "(M_Product_ID, C_AcctSchema_ID,"
				+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,"
				+ " P_Revenue_Acct, P_Expense_Acct, P_CostAdjustment_Acct, P_InventoryClearing_Acct, P_Asset_Acct, P_CoGs_Acct,"
				+ " P_PurchasePriceVariance_Acct, P_InvoicePriceVariance_Acct,"
				+ " P_TradeDiscountRec_Acct, P_TradeDiscountGrant_Acct) "
				+ "SELECT p.M_Product_ID, acct.C_AcctSchema_ID,"
				+ " p.AD_Client_ID, p.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,"
				+ " acct.P_Revenue_Acct, acct.P_Expense_Acct, acct.P_CostAdjustment_Acct, acct.P_InventoryClearing_Acct, acct.P_Asset_Acct, acct.P_CoGs_Acct,"
				+ " acct.P_PurchasePriceVariance_Acct, acct.P_InvoicePriceVariance_Acct,"
				+ " acct.P_TradeDiscountRec_Acct, acct.P_TradeDiscountGrant_Acct "
				+ "FROM M_Product p"
				+ " INNER JOIN M_Product_Category_Acct acct ON (acct.M_Product_Category_ID=p.M_Product_Category_ID)"
				+ "WHERE acct.C_AcctSchema_ID=" + _C_AcctSchema_ID
				+ " AND p.M_Product_Category_ID=acct.M_Product_Category_ID"
				+ " AND NOT EXISTS (SELECT * FROM M_Product_Acct pa "
					+ "WHERE pa.M_Product_ID=p.M_Product_ID"
					+ " AND pa.C_AcctSchema_ID=acct.C_AcctSchema_ID)";
			created = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
			AddLog(0, null, Utility.Util.GetValueOfDecimal(created), "@Created@ @M_Product_ID@");
			createdTotal += created;
		}
		
		
		//	Update Business Partner Group
		if (_CopyOverwriteAcct)
		{
			sql = "UPDATE C_BP_Group_Acct a "
				+ "SET C_Receivable_Acct=" + acct.GetC_Receivable_Acct()
				+ ", C_Receivable_Services_Acct=" + acct.GetC_Receivable_Services_Acct()
				+ ", C_Prepayment_Acct=" + acct.GetC_Prepayment_Acct()
				+ ", V_Liability_Acct=" + acct.GetV_Liability_Acct()
				+ ", V_Liability_Services_Acct=" + acct.GetV_Liability_Services_Acct()
				+ ", V_Prepayment_Acct=" + acct.GetV_Prepayment_Acct()
				+ ", PayDiscount_Exp_Acct=" + acct.GetPayDiscount_Exp_Acct()
				+ ", PayDiscount_Rev_Acct=" + acct.GetPayDiscount_Rev_Acct()
				+ ", WriteOff_Acct=" + acct.GetWriteOff_Acct()
				+ ", NotInvoicedReceipts_Acct=" + acct.GetNotInvoicedReceipts_Acct()
				+ ", UnEarnedRevenue_Acct=" + acct.GetUnEarnedRevenue_Acct()
				+ ", NotInvoicedRevenue_Acct=" + acct.GetNotInvoicedRevenue_Acct()
				+ ", NotInvoicedReceivables_Acct=" + acct.GetNotInvoicedReceivables_Acct()
				+ ", Updated=SysDate, UpdatedBy=0 "
				+ "WHERE a.C_AcctSchema_ID=" + _C_AcctSchema_ID
				+ " AND EXISTS (SELECT * FROM C_BP_Group_Acct x "
					+ "WHERE x.C_BP_Group_ID=a.C_BP_Group_ID)";
			updated = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
			AddLog(0, null,Utility.Util.GetValueOfDecimal(updated), "@Updated@ @C_BP_Group_ID@");
			updatedTotal += updated;
		}
		// Insert Business Partner Group
		sql = "INSERT INTO C_BP_Group_Acct "
			+ "(C_BP_Group_ID, C_AcctSchema_ID,"
			+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,"
			+ " C_Receivable_Acct, C_Receivable_Services_Acct, C_PrePayment_Acct,"
			+ " V_Liability_Acct, V_Liability_Services_Acct, V_PrePayment_Acct,"
			+ " PayDiscount_Exp_Acct, PayDiscount_Rev_Acct, WriteOff_Acct,"
			+ " NotInvoicedReceipts_Acct, UnEarnedRevenue_Acct,"
			+ " NotInvoicedRevenue_Acct, NotInvoicedReceivables_Acct) "
			+ "SELECT x.C_BP_Group_ID, acct.C_AcctSchema_ID,"
			+ " x.AD_Client_ID, x.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,"
			+ " acct.C_Receivable_Acct, acct.C_Receivable_Services_Acct, acct.C_PrePayment_Acct,"
			+ " acct.V_Liability_Acct, acct.V_Liability_Services_Acct, acct.V_PrePayment_Acct,"
			+ " acct.PayDiscount_Exp_Acct, acct.PayDiscount_Rev_Acct, acct.WriteOff_Acct,"
			+ " acct.NotInvoicedReceipts_Acct, acct.UnEarnedRevenue_Acct,"
			+ " acct.NotInvoicedRevenue_Acct, acct.NotInvoicedReceivables_Acct "
			+ "FROM C_BP_Group x"
			+ " INNER JOIN C_AcctSchema_Default acct ON (x.AD_Client_ID=acct.AD_Client_ID) "
			+ "WHERE acct.C_AcctSchema_ID=" + _C_AcctSchema_ID
			+ " AND NOT EXISTS (SELECT * FROM C_BP_Group_Acct a "
				+ "WHERE a.C_BP_Group_ID=x.C_BP_Group_ID"
				+ " AND a.C_AcctSchema_ID=acct.C_AcctSchema_ID)";
		created = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
		AddLog(0, null, Utility.Util.GetValueOfDecimal(created), "@Created@ @C_BP_Group_ID@");
		createdTotal += created;

		
		//	Update Business Partner - Employee
		if (_CopyOverwriteAcct)
		{
			sql = "UPDATE C_BP_Employee_Acct a "
				+ "SET E_Expense_Acct=" + acct.GetE_Expense_Acct()
				+ ", E_Prepayment_Acct=" + acct.GetE_Prepayment_Acct()
				+ ", Updated=SysDate, UpdatedBy=0 "
				+ "WHERE a.C_AcctSchema_ID=" + _C_AcctSchema_ID
				+ " AND EXISTS (SELECT * FROM C_BP_Employee_Acct x "
					+ "WHERE x.C_BPartner_ID=a.C_BPartner_ID)";
			updated = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
			AddLog(0, null, Utility.Util.GetValueOfDecimal(updated), "@Updated@ @C_BPartner_ID@ @IsEmployee@");
			updatedTotal += updated;
		}
		//	Insert new Business Partner - Employee
		sql = "INSERT INTO C_BP_Employee_Acct "
			+ "(C_BPartner_ID, C_AcctSchema_ID,"
			+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,"
			+ " E_Expense_Acct, E_Prepayment_Acct) "
			+ "SELECT x.C_BPartner_ID, acct.C_AcctSchema_ID,"
			+ " x.AD_Client_ID, x.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,"
			+ " acct.E_Expense_Acct, acct.E_Prepayment_Acct "
			+ "FROM C_BPartner x"
			+ " INNER JOIN C_AcctSchema_Default acct ON (x.AD_Client_ID=acct.AD_Client_ID) "
			+ "WHERE acct.C_AcctSchema_ID=" + _C_AcctSchema_ID
			+ " AND NOT EXISTS (SELECT * FROM C_BP_Employee_Acct a "
				+ "WHERE a.C_BPartner_ID=x.C_BPartner_ID"
				+ " AND a.C_AcctSchema_ID=acct.C_AcctSchema_ID)";
		created = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
		AddLog(0, null,Utility.Util.GetValueOfDecimal(created), "@Created@ @C_BPartner_ID@ @IsEmployee@");
		createdTotal += created;
		//
		if (!_CopyOverwriteAcct)
		{
			sql = "INSERT INTO C_BP_Customer_Acct "
				+ "(C_BPartner_ID, C_AcctSchema_ID,"
				+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,"
				+ " C_Receivable_Acct, C_Receivable_Services_Acct, C_PrePayment_Acct) "
				+ "SELECT p.C_BPartner_ID, acct.C_AcctSchema_ID,"
				+ " p.AD_Client_ID, p.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,"
				+ " acct.C_Receivable_Acct, acct.C_Receivable_Services_Acct, acct.C_PrePayment_Acct "
				+ "FROM C_BPartner p"
				+ " INNER JOIN C_BP_Group_Acct acct ON (acct.C_BP_Group_ID=p.C_BP_Group_ID)"
				+ "WHERE acct.C_AcctSchema_ID=" + _C_AcctSchema_ID			//	#
				+ " AND p.C_BP_Group_ID=acct.C_BP_Group_ID"
				+ " AND NOT EXISTS (SELECT * FROM C_BP_Customer_Acct ca "
					+ "WHERE ca.C_BPartner_ID=p.C_BPartner_ID"
					+ " AND ca.C_AcctSchema_ID=acct.C_AcctSchema_ID)";
			created = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
			AddLog(0, null,Utility.Util.GetValueOfDecimal(created), "@Created@ @C_BPartner_ID@ @IsCustomer@");
			createdTotal += created;
			//
			sql = "INSERT INTO C_BP_Vendor_Acct "
				+ "(C_BPartner_ID, C_AcctSchema_ID,"
				+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,"
				+ " V_Liability_Acct, V_Liability_Services_Acct, V_PrePayment_Acct) "
				+ "SELECT p.C_BPartner_ID, acct.C_AcctSchema_ID,"
				+ " p.AD_Client_ID, p.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,"
				+ " acct.V_Liability_Acct, acct.V_Liability_Services_Acct, acct.V_PrePayment_Acct "
				+ "FROM C_BPartner p"
				+ " INNER JOIN C_BP_Group_Acct acct ON (acct.C_BP_Group_ID=p.C_BP_Group_ID)"
				+ "WHERE acct.C_AcctSchema_ID=" + _C_AcctSchema_ID			//	#
				+ " AND p.C_BP_Group_ID=acct.C_BP_Group_ID"
				+ " AND NOT EXISTS (SELECT * FROM C_BP_Vendor_Acct va "
					+ "WHERE va.C_BPartner_ID=p.C_BPartner_ID AND va.C_AcctSchema_ID=acct.C_AcctSchema_ID)";
			created = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
			AddLog(0, null,Utility.Util.GetValueOfDecimal(created), "@Created@ @C_BPartner_ID@ @IsVendor@");
			createdTotal += created;
		}

		//	Update Warehouse
		if (_CopyOverwriteAcct)
		{
			sql = "UPDATE M_Warehouse_Acct a "
				+ "SET W_Inventory_Acct=" + acct.GetW_Inventory_Acct()
				+ ", W_Differences_Acct=" + acct.GetW_Differences_Acct()
				+ ", W_Revaluation_Acct=" + acct.GetW_Revaluation_Acct()
				+ ", W_InvActualAdjust_Acct=" + acct.GetW_InvActualAdjust_Acct()
				+ ", Updated=SysDate, UpdatedBy=0 "
				+ "WHERE a.C_AcctSchema_ID=" + _C_AcctSchema_ID
				+ " AND EXISTS (SELECT * FROM M_Warehouse_Acct x "
					+ "WHERE x.M_Warehouse_ID=a.M_Warehouse_ID)";
			updated = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
			AddLog(0, null,Utility.Util.GetValueOfDecimal(updated), "@Updated@ @M_Warehouse_ID@");
			updatedTotal += updated;
		}
		//	Insert new Warehouse
		sql = "INSERT INTO M_Warehouse_Acct "
			+ "(M_Warehouse_ID, C_AcctSchema_ID,"
			+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,"
			+ " W_Inventory_Acct, W_Differences_Acct, W_Revaluation_Acct, W_InvActualAdjust_Acct) "
			+ "SELECT x.M_Warehouse_ID, acct.C_AcctSchema_ID,"
			+ " x.AD_Client_ID, x.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,"
			+ " acct.W_Inventory_Acct, acct.W_Differences_Acct, acct.W_Revaluation_Acct, acct.W_InvActualAdjust_Acct "
			+ "FROM M_Warehouse x"
			+ " INNER JOIN C_AcctSchema_Default acct ON (x.AD_Client_ID=acct.AD_Client_ID) "
			+ "WHERE acct.C_AcctSchema_ID=" + _C_AcctSchema_ID
			+ " AND NOT EXISTS (SELECT * FROM M_Warehouse_Acct a "
				+ "WHERE a.M_Warehouse_ID=x.M_Warehouse_ID"
				+ " AND a.C_AcctSchema_ID=acct.C_AcctSchema_ID)";
		created = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
		AddLog(0, null, Utility.Util.GetValueOfDecimal(created), "@Created@ @M_Warehouse_ID@");
		createdTotal += created;


		//	Update Project
		if (_CopyOverwriteAcct)
		{
			sql = "UPDATE C_Project_Acct a "
				+ "SET PJ_Asset_Acct=" + acct.GetPJ_Asset_Acct()
				+ ", PJ_WIP_Acct=" + acct.GetPJ_Asset_Acct()
				+ ", Updated=SysDate, UpdatedBy=0 "
				+ "WHERE a.C_AcctSchema_ID=" + _C_AcctSchema_ID
				+ " AND EXISTS (SELECT * FROM C_Project_Acct x "
					+ "WHERE x.C_Project_ID=a.C_Project_ID)";
			updated = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
			AddLog(0, null,Utility.Util.GetValueOfDecimal(updated), "@Updated@ @C_Project_ID@");
			updatedTotal += updated;
		}
		//	Insert new Projects
		sql = "INSERT INTO C_Project_Acct "
			+ "(C_Project_ID, C_AcctSchema_ID,"
			+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,"
			+ " PJ_Asset_Acct, PJ_WIP_Acct) "
			+ "SELECT x.C_Project_ID, acct.C_AcctSchema_ID,"
			+ " x.AD_Client_ID, x.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,"
			+ " acct.PJ_Asset_Acct, acct.PJ_WIP_Acct "
			+ "FROM C_Project x"
			+ " INNER JOIN C_AcctSchema_Default acct ON (x.AD_Client_ID=acct.AD_Client_ID) "
			+ "WHERE acct.C_AcctSchema_ID=" + _C_AcctSchema_ID
			+ " AND NOT EXISTS (SELECT * FROM C_Project_Acct a "
				+ "WHERE a.C_Project_ID=x.C_Project_ID"
				+ " AND a.C_AcctSchema_ID=acct.C_AcctSchema_ID)";
		created = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
		AddLog(0, null, Utility.Util.GetValueOfDecimal(created), "@Created@ @C_Project_ID@");
		createdTotal += created;


		//	Update Tax
		if (_CopyOverwriteAcct)
		{
			sql = "UPDATE C_Tax_Acct a "
				+ "SET T_Due_Acct=" + acct.GetT_Due_Acct()
				+ ", T_Liability_Acct=" + acct.GetT_Liability_Acct()
				+ ", T_Credit_Acct=" + acct.GetT_Credit_Acct()
				+ ", T_Receivables_Acct=" + acct.GetT_Receivables_Acct()
				+ ", T_Expense_Acct=" + acct.GetT_Expense_Acct()
				+ ", Updated=SysDate, UpdatedBy=0 "
				+ "WHERE a.C_AcctSchema_ID=" + _C_AcctSchema_ID
				+ " AND EXISTS (SELECT * FROM C_Tax_Acct x "
					+ "WHERE x.C_Tax_ID=a.C_Tax_ID)";
			updated = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
			AddLog(0, null,Utility.Util.GetValueOfDecimal(updated), "@Updated@ @C_Tax_ID@");
			updatedTotal += updated;
		}
		//	Insert new Tax
		sql = "INSERT INTO C_Tax_Acct "
			+ "(C_Tax_ID, C_AcctSchema_ID,"
			+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,"
			+ " T_Due_Acct, T_Liability_Acct, T_Credit_Acct, T_Receivables_Acct, T_Expense_Acct) "
			+ "SELECT x.C_Tax_ID, acct.C_AcctSchema_ID,"
			+ " x.AD_Client_ID, x.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,"
			+ " acct.T_Due_Acct, acct.T_Liability_Acct, acct.T_Credit_Acct, acct.T_Receivables_Acct, acct.T_Expense_Acct "
			+ "FROM C_Tax x"
			+ " INNER JOIN C_AcctSchema_Default acct ON (x.AD_Client_ID=acct.AD_Client_ID) "
			+ "WHERE acct.C_AcctSchema_ID=" + _C_AcctSchema_ID
			+ " AND NOT EXISTS (SELECT * FROM C_Tax_Acct a "
				+ "WHERE a.C_Tax_ID=x.C_Tax_ID"
				+ " AND a.C_AcctSchema_ID=acct.C_AcctSchema_ID)";
		created = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
		AddLog(0, null,Utility.Util.GetValueOfDecimal(created), "@Created@ @C_Tax_ID@");
		createdTotal += created;


		//	Update BankAccount
		if (_CopyOverwriteAcct)
		{
			sql = "UPDATE C_BankAccount_Acct a "
				+ "SET B_InTransit_Acct=" + acct.GetB_InTransit_Acct()
				+ ", B_Asset_Acct=" + acct.GetB_Asset_Acct()
				+ ", B_Expense_Acct=" + acct.GetB_Expense_Acct()
				+ ", B_InterestRev_Acct=" + acct.GetB_InterestRev_Acct()
				+ ", B_InterestExp_Acct=" + acct.GetB_InterestExp_Acct()
				+ ", B_Unidentified_Acct=" + acct.GetB_Unidentified_Acct()
				+ ", B_UnallocatedCash_Acct=" + acct.GetB_UnallocatedCash_Acct()
				+ ", B_PaymentSelect_Acct=" + acct.GetB_PaymentSelect_Acct()
				+ ", B_SettlementGain_Acct=" + acct.GetB_SettlementGain_Acct()
				+ ", B_SettlementLoss_Acct=" + acct.GetB_SettlementLoss_Acct()
				+ ", B_RevaluationGain_Acct=" + acct.GetB_RevaluationGain_Acct()
				+ ", B_RevaluationLoss_Acct=" + acct.GetB_RevaluationLoss_Acct()
				+ ", Updated=SysDate, UpdatedBy=0 "
				+ "WHERE a.C_AcctSchema_ID=" + _C_AcctSchema_ID
				+ " AND EXISTS (SELECT * FROM C_BankAccount_Acct x "
					+ "WHERE x.C_BankAccount_ID=a.C_BankAccount_ID)";
			updated = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
			AddLog(0, null,Utility.Util.GetValueOfDecimal(updated), "@Updated@ @C_BankAccount_ID@");
			updatedTotal += updated;
		}
		//	Insert new BankAccount
		sql = "INSERT INTO C_BankAccount_Acct "
			+ "(C_BankAccount_ID, C_AcctSchema_ID,"
			+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,"
			+ " B_InTransit_Acct, B_Asset_Acct, B_Expense_Acct, B_InterestRev_Acct, B_InterestExp_Acct,"
			+ " B_Unidentified_Acct, B_UnallocatedCash_Acct, B_PaymentSelect_Acct,"
			+ " B_SettlementGain_Acct, B_SettlementLoss_Acct,"
			+ " B_RevaluationGain_Acct, B_RevaluationLoss_Acct) "
			+ "SELECT x.C_BankAccount_ID, acct.C_AcctSchema_ID,"
			+ " x.AD_Client_ID, x.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,"
			+ " acct.B_InTransit_Acct, acct.B_Asset_Acct, acct.B_Expense_Acct, acct.B_InterestRev_Acct, acct.B_InterestExp_Acct,"
			+ " acct.B_Unidentified_Acct, acct.B_UnallocatedCash_Acct, acct.B_PaymentSelect_Acct,"
			+ " acct.B_SettlementGain_Acct, acct.B_SettlementLoss_Acct,"
			+ " acct.B_RevaluationGain_Acct, acct.B_RevaluationLoss_Acct "
			+ "FROM C_BankAccount x"
			+ " INNER JOIN C_AcctSchema_Default acct ON (x.AD_Client_ID=acct.AD_Client_ID) "
			+ "WHERE acct.C_AcctSchema_ID=" + _C_AcctSchema_ID
			+ " AND NOT EXISTS (SELECT * FROM C_BankAccount_Acct a "
				+ "WHERE a.C_BankAccount_ID=x.C_BankAccount_ID"
				+ " AND a.C_AcctSchema_ID=acct.C_AcctSchema_ID)";
		created = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
		AddLog(0, null,Utility.Util.GetValueOfDecimal(created), "@Created@ @C_BankAccount_ID@");
		createdTotal += created;


		//	Update Withholding
		if (_CopyOverwriteAcct)
		{
			sql = "UPDATE C_Withholding_Acct a "
				+ "SET Withholding_Acct=" + acct.GetWithholding_Acct()
				+ ", Updated=SysDate, UpdatedBy=0 "
				+ "WHERE a.C_AcctSchema_ID=" + _C_AcctSchema_ID 
				+ " AND EXISTS (SELECT * FROM C_Withholding_Acct x "
					+ "WHERE x.C_Withholding_ID=a.C_Withholding_ID)";
			updated = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
			AddLog(0, null,Utility.Util.GetValueOfDecimal(updated), "@Updated@ @C_Withholding_ID@");
			updatedTotal += updated;
		}
		//	Insert new Withholding
		sql = "INSERT INTO C_Withholding_Acct "
			+ "(C_Withholding_ID, C_AcctSchema_ID,"
			+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,"
			+ "	Withholding_Acct) "
			+ "SELECT x.C_Withholding_ID, acct.C_AcctSchema_ID,"
			+ " x.AD_Client_ID, x.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,"
			+ " acct.Withholding_Acct "
			+ "FROM C_Withholding x"
			+ " INNER JOIN C_AcctSchema_Default acct ON (x.AD_Client_ID=acct.AD_Client_ID) "
			+ "WHERE acct.C_AcctSchema_ID=" + _C_AcctSchema_ID
			+ " AND NOT EXISTS (SELECT * FROM C_Withholding_Acct a "
				+ "WHERE a.C_Withholding_ID=x.C_Withholding_ID"
				+ " AND a.C_AcctSchema_ID=acct.C_AcctSchema_ID)";
		created = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
		AddLog(0, null,Utility.Util.GetValueOfDecimal(created), "@Created@ @C_Withholding_ID@");
		createdTotal += created;

		
		//	Update Charge
		if (_CopyOverwriteAcct)
		{
			sql = "UPDATE C_Charge_Acct a "
				+ "SET Ch_Expense_Acct=" + acct.GetCh_Expense_Acct()
				+ ", Ch_Revenue_Acct=" + acct.GetCh_Revenue_Acct()
				+ ", Updated=SysDate, UpdatedBy=0 "
				+ "WHERE a.C_AcctSchema_ID=" + _C_AcctSchema_ID
				+ " AND EXISTS (SELECT * FROM C_Charge_Acct x "
					+ "WHERE x.C_Charge_ID=a.C_Charge_ID)";
			updated = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
			AddLog(0, null,Utility.Util.GetValueOfDecimal(updated), "@Updated@ @C_Charge_ID@");
			updatedTotal += updated;
		}
		//	Insert new Charge
		sql = "INSERT INTO C_Charge_Acct "
			+ "(C_Charge_ID, C_AcctSchema_ID,"
			+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,"
			+ " Ch_Expense_Acct, Ch_Revenue_Acct) "
			+ "SELECT x.C_Charge_ID, acct.C_AcctSchema_ID,"
			+ " x.AD_Client_ID, x.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,"
			+ " acct.Ch_Expense_Acct, acct.Ch_Revenue_Acct "
			+ "FROM C_Charge x"
			+ " INNER JOIN C_AcctSchema_Default acct ON (x.AD_Client_ID=acct.AD_Client_ID) "
			+ "WHERE acct.C_AcctSchema_ID=" + _C_AcctSchema_ID
			+ " AND NOT EXISTS (SELECT * FROM C_Charge_Acct a "
				+ "WHERE a.C_Charge_ID=x.C_Charge_ID"
				+ " AND a.C_AcctSchema_ID=acct.C_AcctSchema_ID)";
		created = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
		AddLog(0, null,Utility.Util.GetValueOfDecimal(created), "@Created@ @C_Charge_ID@");
		createdTotal += created;


		//	Update Cashbook
		if (_CopyOverwriteAcct)
		{
			sql = "UPDATE C_Cashbook_Acct a "
				+ "SET CB_Asset_Acct=" + acct.GetCB_Asset_Acct()
				+ ", CB_Differences_Acct=" + acct.GetCB_Differences_Acct()
				+ ", CB_CashTransfer_Acct=" + acct.GetCB_CashTransfer_Acct()
				+ ", CB_Expense_Acct=" + acct.GetCB_Expense_Acct()
				+ ", CB_Receipt_Acct=" + acct.GetCB_Receipt_Acct()
				+ ", Updated=SysDate, UpdatedBy=0 "
				+ "WHERE a.C_AcctSchema_ID=" + _C_AcctSchema_ID
				+ " AND EXISTS (SELECT * FROM C_Cashbook_Acct x "
					+ "WHERE x.C_Cashbook_ID=a.C_Cashbook_ID)";
			updated = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
			AddLog(0, null, Utility.Util.GetValueOfDecimal(updated), "@Updated@ @C_Cashbook_ID@");
			updatedTotal += updated;
		}
		//	Insert new Cashbook
		sql = "INSERT INTO C_Cashbook_Acct "
			+ "(C_Cashbook_ID, C_AcctSchema_ID,"
			+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,"
			+ " CB_Asset_Acct, CB_Differences_Acct, CB_CashTransfer_Acct,"
			+ " CB_Expense_Acct, CB_Receipt_Acct) "
			+ "SELECT x.C_Cashbook_ID, acct.C_AcctSchema_ID,"
			+ " x.AD_Client_ID, x.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,"
			+ " acct.CB_Asset_Acct, acct.CB_Differences_Acct, acct.CB_CashTransfer_Acct,"
			+ " acct.CB_Expense_Acct, acct.CB_Receipt_Acct "
			+ "FROM C_Cashbook x"
			+ " INNER JOIN C_AcctSchema_Default acct ON (x.AD_Client_ID=acct.AD_Client_ID) "
			+ "WHERE acct.C_AcctSchema_ID=" + _C_AcctSchema_ID
			+ " AND NOT EXISTS (SELECT * FROM C_Cashbook_Acct a "
				+ "WHERE a.C_Cashbook_ID=x.C_Cashbook_ID"
				+ " AND a.C_AcctSchema_ID=acct.C_AcctSchema_ID)";
		created = DataBase.DB.ExecuteQuery(sql,null, Get_TrxName());
		AddLog(0, null,Utility.Util.GetValueOfDecimal(created), "@Created@ @C_Cashbook_ID@");
		createdTotal += created;
		
		return "@Created@=" + createdTotal + ", @Updated@=" + updatedTotal;
	}	//	doIt
	
}	//	AcctSchemaDefaultCopy

}
